home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 010 / games.arc / G-MASTER.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1980-01-01  |  24.3 KB  |  719 lines

  1. 100  '**********************************************************************
  2. 110  '**                       GRAPH MASTER                               **
  3. 120  '**                CREATES GRAPHS FOR DISPLAY                        **
  4. 130  '**                                                                  **
  5. 140  '**           VERSION 1.1                JULY 14, 1982               **
  6. 150  '**                                                                  **
  7. 160  '**********************************************************************
  8. 170  '
  9. 180  SCREEN 2 : KEY OFF : OPTION BASE 1 : GOSUB 500
  10. 190  '
  11. 200  '**********************************************************************
  12. 210  '**  THIS SECTION PRINTS THE MENU FOR THE SELECTIONS                 **
  13. 220  '**********************************************************************
  14. 230  '
  15. 240  SCREEN 0 : WIDTH 80 : CLS
  16. 250  LOCATE 2,24 : PRINT "****************"
  17. 260  LOCATE 3,24 : PRINT "* GRAPH MASTER *"
  18. 270  LOCATE 4,24 : PRINT "****************"
  19. 280  LOCATE 7,20 : PRINT "1 = Labels For Graph
  20. 290  LOCATE 8,20 : PRINT "2 = Input Data From Cassette Or Disk
  21. 300  LOCATE 9,20 : PRINT "3 = Output Data To Cassette Or Disk
  22. 310  LOCATE 10,20 : PRINT "4 = Enter Data Values And Labels
  23. 320  LOCATE 11,20 : PRINT "5 = Generate Graphs
  24. 330  LOCATE 17,1 : PRINT "ENTER SELECTION AT DASH  (1 THRU 5 ONLY)
  25. 340  LOCATE 18,1 : PRINT "USE THE ";CHR$(27);" (BACKSPACE) KEY TO BACKSPACE
  26. 350  ROW = 18 : COLUMN = 50 : LENGTH = 1
  27. 360  GOSUB 30000
  28. 370  IF (B$>CHR$(48)) AND (B$<CHR$(54)) THEN B = ASC(B$) - 48 : GOTO 420
  29. 380  COLOR 23 : LOCATE 14,1 : PRINT "ERROR IN INPUT - PLEASE SELECT AGAIN
  30. 390  FOR X = 1 TO 2000 : NEXT
  31. 400  COLOR 7 : LOCATE 14,1 : PRINT "                                     "
  32. 410  GOTO 350
  33. 420  ON B GOTO 1000,2000,3000,4000,6000
  34. 500  '
  35. 510  '**********************************************************************
  36. 520  '**  THIS SECTION INITIALIZES THE VARIABLES IN A SUBROUTINE          **
  37. 530  '**********************************************************************
  38. 540  '
  39. 550  DEFSTR A : DIM A(100),DATAVAL(200),DATALABEL$(36)
  40. 560  MAXCOUNT = 20 : PRINTLABELS = 1 : DATAPOINTS = 12
  41. 570  ATITLE1 = "" : ATITLE2 = "" : ATITLE3 = "" : ATITLE4 = ""
  42. 580  RETURN
  43. 1000  '
  44. 1010  '**********************************************************************
  45. 1020  '**  This Section Allows You To Enter The Labels For The Graph       **
  46. 1030  '**********************************************************************
  47. 1040  '
  48. 1050  CLS
  49. 1060  PRINT "This Section Sets Up The Labels For The Graph
  50. 1070  PRINT "---------------------------------------------
  51. 1080  LOCATE 4,1
  52. 1090  PRINT "If You Would Like To Keep The Present Label, Simply Press <Return>
  53. 1100  PRINT "Else,  Enter The New Label On The Dashes   --------
  54. 1110  '
  55. 1120  LOCATE 7,1
  56. 1130  PRINT "The First Line Of The Title Is -        ";
  57. 1140  PRINT ATITLE1
  58. 1150  ROW = 9 : COLUMN = 1 : LENGTH = 40 : GOSUB 30010
  59. 1160  IF B$ = "" THEN 1180
  60. 1170  ATITLE1 = B$
  61. 1180  '
  62. 1190  LOCATE 11,1
  63. 1200  PRINT "The Second Line Of The Title Is -       ";
  64. 1210  PRINT ATITLE2
  65. 1220  ROW = 13 : COLUMN = 1 : LENGTH = 40 : GOSUB 30010
  66. 1230  IF B$ = "" THEN 1250
  67. 1240  ATITLE2 = B$
  68. 1250  '
  69. 1260  LOCATE 16,1
  70. 1270  PRINT "The Label For The Data Catagories Is -  ";
  71. 1280  PRINT ATITLE3
  72. 1290  ROW = 18 : COLUMN = 1 : LENGTH = 40 : GOSUB 30010
  73. 1300  IF B$ = "" THEN 1320
  74. 1310  ATITLE3 = B$
  75. 1320  '
  76. 1330  LOCATE 21,1
  77. 1340  PRINT "The Label For The Data Values Is -      ";
  78. 1350  PRINT ATITLE4
  79. 1360  ROW = 23 : COLUMN = 1 : LENGTH = 40 : GOSUB 30010
  80. 1370  IF B$ = "" THEN 1390
  81. 1380  ATITLE4 = B$
  82. 1390  '
  83. 1400  GOTO 240        ' RETURN TO MENU
  84. 2000  '
  85. 2010  '**********************************************************************
  86. 2020  '**  This Section Reads Data Input From Cassette Or Disk             **
  87. 2030  '**********************************************************************
  88. 2040  '
  89. 2050  CLS : SCREEN 2
  90. 2060  INPUT "ENTER FILENAME INCLUDING EXTENSIONS " ; FILEDATA$ : CLS
  91. 2070  OPEN FILEDATA$ FOR INPUT AS #1
  92. 2080  INPUT#1,ATITLE1,ATITLE2
  93. 2090  INPUT#1,ATITLE3,ATITLE4
  94. 2100  INPUT#1,DATAPOINTS,GRAPHTYPE,PRINTLABELS,MAXVAL,MINVAL,LABELLENGTH
  95. 2110  FOR X = 1 TO DATAPOINTS
  96. 2120  INPUT#1,DATAVAL(X)
  97. 2130  IF PRINTLABELS = 1 THEN 2140 ELSE 2150
  98. 2140  INPUT#1,DATALABEL$(X)
  99. 2150  NEXT X : CLOSE
  100. 2160  '
  101. 2170  ON GRAPHTYPE GOSUB 8070,9070,10070,12070
  102. 2180  '
  103. 2190  CLS
  104. 2200  PRINT "PRESS 1 FOR MENU"
  105. 2210  PRINT "PRESS 2 FOR NEXT GRAPH"
  106. 2220  A$ = INKEY$ : IF A$ = "" THEN 2220
  107. 2230  IF VAL(A$) = 1 THEN GOTO 240
  108. 2240  IF VAL(A$) = 2 THEN GOTO 2050
  109. 2250  GOTO 2180
  110. 3000  '
  111. 3010  '**********************************************************************
  112. 3020  '**  This Section Writes Data Out To Cassette Or Disk                **
  113. 3030  '**********************************************************************
  114. 3040  '
  115. 3050  CLS : SCREEN 2
  116. 3060  INPUT "ENTER FILENAME INCLUDING EXTENSIONS " ; FILEDATA$
  117. 3070  OPEN FILEDATA$ FOR OUTPUT AS #1
  118. 3080  PRINT#1,CHR$(34);ATITLE1;CHR$(34);CHR$(34);ATITLE2;CHR$(34)
  119. 3090  PRINT#1,CHR$(34);ATITLE3;CHR$(34);CHR$(34);ATITLE4;CHR$(34)
  120. 3100  PRINT#1,DATAPOINTS;GRAPHTYPE;PRINTLABELS,MAXVAL,MINVAL,LABELLENGTH
  121. 3110  FOR X = 1 TO DATAPOINTS
  122. 3120  PRINT#1,DATAVAL(X)
  123. 3130  IF PRINTLABELS = 1 THEN 3140 ELSE 3150
  124. 3140  PRINT#1,CHR$(34);DATALABEL$(X);CHR$(34)
  125. 3150  NEXT X
  126. 3160  '
  127. 3170  LOCATE 25,1 : INPUT "PRESS ENTER TO RETURN TO MENU -";A$
  128. 3180  CLOSE : GOTO 240
  129. 4000  '
  130. 4010  '**********************************************************************
  131. 4020  '**  This Section Gets The Data For The Graph                        **
  132. 4030  '**********************************************************************
  133. 4040  '
  134. 4050  CLS
  135. 4060  LOCATE 1,25 : PRINT "Data Entry
  136. 4070  LOCATE 2,25 : PRINT "---- -----
  137. 4080  LOCATE 5,1
  138. 4090  PRINT "Here We Will Enter The Data And Their Corresponding Labels
  139. 4100  PRINT
  140. 4110  PRINT "If You Would Like To Keep The Present Values, Simply Press <Return>
  141. 4120  PRINT "Else,  Enter The New Values On The Dashes   --------
  142. 4130  LOCATE 10,1
  143. 4140  PRINT "Would You Like To Have Labels For The Data Entries ?
  144. 4150  PRINT "For Example - (1981 or Hogs) etc.
  145. 4160  PRINT "Presently You Are Set Up For ";
  146. 4170  IF PRINTLABELS = 1 THEN PRINT "USING Labels" ELSE PRINT "NOT USING Labels
  147. 4180  LOCATE 14,1 : PRINT "Yes = 1
  148. 4190  LOCATE 15,1 : PRINT "No  = 2
  149. 4200  ROW = 15 : COLUMN = 10 : LENGTH = 1 : GOSUB 30010
  150. 4210  IF B$ = "" THEN 4230
  151. 4220  IF (ASC(B$)-48) = 1 THEN PRINTLABELS = 1 ELSE PRINTLABELS = 2
  152. 4230  LOCATE 17,1
  153. 4240  PRINT "Please Enter The Number Of Data Points To Be Graphed
  154. 4250  PRINT "This Number May Be From 1-35 If You Are Using Labels Or
  155. 4260  PRINT "                   From 1-200 If You Are Not.
  156. 4270  PRINT "Presently You Are Set Up For ";DATAPOINTS;" Data Points.
  157. 4280  PRINT ">>>>>>>"
  158. 4290  ROW = 21 : COLUMN = 10 : LENGTH = 3 : GOSUB 30010
  159. 4300  IF B$ = "" THEN 4410
  160. 4310  B = VAL(B$) : IF B < 1 THEN B = 500
  161. 4320  IF (PRINTLABELS = 1) AND (B > 35) THEN 4330 ELSE 4360
  162. 4330  LOCATE 23,1 : PRINT "FROM 1 TO 35 WHEN USING LABELS (ONLY) "
  163. 4340  FOR X = 1 TO 1000 : NEXT X
  164. 4350  LOCATE 23,1 : PRINT "                                      ":GOTO 4230
  165. 4360  IF (PRINTLABELS = 2) AND (B > 200) THEN 4370 ELSE 4400
  166. 4370  LOCATE 23,1 : PRINT "FROM 1 TO 200 WITHOUT LABELS (ONLY) "
  167. 4380  FOR X = 1 TO 1000 : NEXT X
  168. 4390  LOCATE 23,1 : PRINT "                                    ":GOTO 4230
  169. 4400  DATAPOINTS = B : GOTO 4420
  170. 4410  IF (PRINTLABELS = 1) AND (DATAPOINTS > 35) THEN 4330
  171. 4420  LOCATE 25,1
  172. 4430  PRINT "Press Enter To Continue ";:INPUT A$
  173. 4440  '
  174. 4450  CLS
  175. 4460  PRINT "Enter The Value Of The Data - <Or>
  176. 4470  PRINT
  177. 4480  PRINT "Enter The Word <END> If This Is The Last Data
  178. 4490  PRINT "      And You Would Like To Return To The Menu - <Or>
  179. 4500  PRINT
  180. 4510  PRINT "Enter The Word <EDIT> If You Would Like To Change
  181. 4520  PRINT "      Some Data Values (Allows You To Skip Around) - <Or>
  182. 4530  PRINT
  183. 4540  PRINT "If You Would Like To Keep The Present Values, Simply Press <Return>
  184. 4550  LOCATE 17,1
  185. 4560  PRINT "Next -
  186. 4570  PRINT
  187. 4580  PRINT "Enter The Label For This Data Element - <Or>
  188. 4590  PRINT
  189. 4600  PRINT "If You Would Like To Keep The Present Labels, Simply Press <Return>
  190. 4610  PRINT
  191. 4620  LOCATE 25,1 : PRINT "PRESS ENTER TO CONTINUE - ";:INPUT A$
  192. 4630  '
  193. 4640  CLS
  194. 4650  LOCATE 25,1 : PRINT "Number    Data ";
  195. 4660  LOCATE 25,21 : IF PRINTLABELS = 1 THEN PRINT "Label ";
  196. 4670  LOCATE 25,40 : PRINT "<END> or <EDIT> on data entry";
  197. 4680  '
  198. 4690  COUNT = 1
  199. 4700  LABELLENGTH = FIX(65/DATAPOINTS )-1
  200. 4710  IF LABELLENGTH > 7 THEN LABELLENGTH = 7
  201. 4720  IF (LABELLENGTH < 1) AND (DATAPOINTS < 35) THEN LABELLENGTH = 1
  202. 4730  LOCATE 22,1 : PRINT USING "###";COUNT
  203. 4740  '
  204. 4750  ROW = 22 : COLUMN = 11 : LENGTH = 4 : GOSUB 30000
  205. 4760  IF B$ = "END" THEN 240
  206. 4770  IF B$ = "EDIT" THEN 4810
  207. 4780  IF B$ = "" THEN 4880
  208. 4790  GOTO 4850
  209. 4800  '
  210. 4810  LOCATE 22,1 : PRINT "                                      ";
  211. 4820  LOCATE 22,1 : INPUT "Edit Which Number - "; COUNT
  212. 4825  LOCATE 22,1 : PRINT "                                      ";
  213. 4830  GOTO 4730
  214. 4840  '
  215. 4850  B = VAL(B$) : IF B < 0 THEN B = 0
  216. 4860  DATAVAL(COUNT) = B
  217. 4870  '
  218. 4880  LOCATE 22,11 : PRINT USING "####.##";DATAVAL(COUNT);
  219. 4890  '
  220. 4900  IF PRINTLABELS = 2 THEN 4980
  221. 4905  IF LABELLENGTH < 1 THEN 4980
  222. 4910  ROW = 22 : COLUMN = 21 : LENGTH = LABELLENGTH : GOSUB 30000
  223. 4920  IF B$ = "" THEN 4950
  224. 4930  DATALABEL$(COUNT) = B$
  225. 4940  '
  226. 4950  LOCATE 22,21 : PRINT "       ";
  227. 4960  LOCATE 22,21 : PRINT DATALABEL$(COUNT);
  228. 4970  '
  229. 4980  PRINT : PRINT : PRINT
  230. 4990  IF COUNT < DATAPOINTS THEN COUNT = COUNT + 1 : GOTO 4730
  231. 5000  '
  232. 5010  LOCATE 25,1 : PRINT "                                                 ";
  233. 5015  LOCATE 25,40 : PRINT "                                    ";
  234. 5020  LOCATE 25,1 : INPUT "Press Enter To Continue ";A$ : GOTO 240
  235. 6000  '
  236. 6010  '**********************************************************************
  237. 6020  '**  This Section Generates The Graphs                               **
  238. 6030  '**********************************************************************
  239. 6040  '
  240. 6050  SCREEN 2 : WIDTH 80 : CLS
  241. 6060  LOCATE 2,24 : PRINT "*******************"
  242. 6070  LOCATE 3,24 : PRINT "* GRAPH GENERATOR *"
  243. 6080  LOCATE 4,24 : PRINT "*******************"
  244. 6090  LOCATE 7,20 : PRINT "1 = Return To Main Menu (Save,Change,etc) Graphs
  245. 6100  LOCATE 8,20 : PRINT
  246. 6110  LOCATE 9,20 : PRINT "2 = Line Graph
  247. 6120  LOCATE 10,20 : PRINT "3 = Bar Graph
  248. 6130  LOCATE 11,20 : PRINT "4 = Horizontal Bar Graph (Max 20 Data Points)
  249. 6140  LOCATE 12,20 : PRINT "5 = Circle Graph
  250. 6150  LOCATE 17,1 : PRINT "ENTER SELECTION AT DASH  (1 THRU 5 ONLY)
  251. 6160  LOCATE 18,1 : PRINT "USE THE ";CHR$(27);" (BACKSPACE) KEY TO BACKSPACE
  252. 6170  ROW = 18 : COLUMN = 50 : LENGTH = 1
  253. 6180  GOSUB 30000
  254. 6190  IF (B$>CHR$(48)) AND (B$<CHR$(54)) THEN B = ASC(B$) - 48 : GOTO 6240
  255. 6200  LOCATE 14,1 : PRINT "ERROR IN INPUT - PLEASE SELECT AGAIN
  256. 6210  FOR X = 1 TO 2000 : NEXT
  257. 6220  LOCATE 14,1 : PRINT "                                     "
  258. 6230  GOTO 6170
  259. 6240  IF B = 1 GOTO 240
  260. 6250  ON B GOSUB 240,8000,9000,10000,12000
  261. 6260  GOTO 6000
  262. 7000  '
  263. 7010  '**********************************************************************
  264. 7020  '**  This Section Gets Minimum And Maximum Values For The Scales     **
  265. 7030  '**********************************************************************
  266. 7040  '
  267. 7050  KEY OFF : SCREEN 2 : CLS
  268. 7060  '
  269. 7070  '** GET MAX AND MIN VALUES OF INPUT ***********************************
  270. 7080  MAXVAL = DATAVAL(1) : MINVAL = DATAVAL(1)
  271. 7090  FOR X = 1 TO DATAPOINTS
  272. 7100  IF (DATAVAL(X) > MAXVAL) THEN MAXVAL = DATAVAL(X)
  273. 7110  IF (DATAVAL(X) < MINVAL) THEN MINVAL = DATAVAL(X)
  274. 7120  NEXT X
  275. 7130  '
  276. 7140  '** CALCULATE A MAX VALUE FOR THE GRAPH LABEL : SET MIN = 0 ***********
  277. 7150  '
  278. 7160  IF MAXVAL < 10000 THEN MAX = 10000
  279. 7170  IF MAXVAL <  8000 THEN MAX =  8000
  280. 7180  IF MAXVAL <  6000 THEN MAX =  6000
  281. 7190  IF MAXVAL <  4000 THEN MAX =  4000
  282. 7200  IF MAXVAL <  2000 THEN MAX =  2000
  283. 7210  IF MAXVAL <  1000 THEN MAX =  1000
  284. 7220  IF MAXVAL <   800 THEN MAX =   800
  285. 7230  IF MAXVAL <   600 THEN MAX =   600
  286. 7240  IF MAXVAL <   400 THEN MAX =   400
  287. 7250  IF MAXVAL <   200 THEN MAX =   200
  288. 7260  IF MAXVAL <   100 THEN MAX =   100
  289. 7270  IF MAXVAL <    80 THEN MAX =    80
  290. 7280  IF MAXVAL <    60 THEN MAX =    60
  291. 7290  IF MAXVAL <    40 THEN MAX =    40
  292. 7300  IF MAXVAL <    20 THEN MAX =    20
  293. 7310  IF MAXVAL <    10 THEN MAX =    10
  294. 7320  IF MAXVAL <     8 THEN MAX =     8
  295. 7330  IF MAXVAL <     6 THEN MAX =     6
  296. 7340  IF MAXVAL <     4 THEN MAX =     4
  297. 7350  IF MAXVAL <     2 THEN MAX =     2
  298. 7360  IF MAXVAL <     1 THEN MAX =     1
  299. 7370  MIN = 0
  300. 7380  '
  301. 7390  '** GET MAX AND MIN VALUES FOR GRAPH LABEL ****************************
  302. 7400  '
  303. 7410  PRINT "The Largest Entered Data Value Was -  ";MAXVAL
  304. 7420  PRINT "The Smallest Entered Data Value Was - ";MINVAL
  305. 7430  PRINT
  306. 7440  PRINT "The Calculated Values For The Maximum And Minimum Graph Scales
  307. 7450  PRINT "To Give The Finished Graph A Balanced Look Is -
  308. 7460  PRINT
  309. 7470  PRINT "Maximum Graph Value = ";MAX
  310. 7480  PRINT "Minimum Graph Value = ";MIN
  311. 7490  PRINT
  312. 7500  PRINT "Enter The Maximum Value For The Graph Scales <Or>
  313. 7510  PRINT "Press Enter For The Computed Value >>>";
  314. 7520  ROW = 11 : COLUMN = 40 : LENGTH = 5 : GOSUB 30000
  315. 7530  IF B$ = "" THEN MAXVAL = MAX : GOTO 7560
  316. 7540  B = VAL(B$) : IF B > MAXVAL THEN MAXVAL = B
  317. 7550  '
  318. 7560  LOCATE 11,40 : PRINT "          "
  319. 7570  LOCATE 11,40 : PRINT USING "#####";MAXVAL
  320. 7580  '
  321. 7590  LOCATE 15,1
  322. 7600  PRINT "Enter The Minimum Value For The Graph Scales <Or>
  323. 7610  PRINT "Press Enter For The Computed Value >>>"
  324. 7620  ROW = 16 : COLUMN = 40 : LENGTH = 5 : GOSUB 30000
  325. 7630  IF B$ = "" THEN MINVAL = MIN : GOTO 7660
  326. 7640  B = VAL(B$) : IF B < MINVAL THEN MINVAL = B
  327. 7650  IF MINVAL < 0 THEN MINVAL = 0
  328. 7660  LOCATE 16,40 : PRINT "          "
  329. 7670  LOCATE 16,40 : PRINT USING "#####";MINVAL
  330. 7680  '
  331. 7690  LOCATE 25,1 : PRINT "Press Enter To Continue -";
  332. 7700  INPUT A$ : CLS :RETURN
  333. 7710  '
  334. 8000  '
  335. 8010  '**********************************************************************
  336. 8020  '**  This Section Draws A Line Graph                                 **
  337. 8030  '**********************************************************************
  338. 8040  '
  339. 8050  KEY OFF : SCREEN 2 : CLS : GRAPHTYPE = 1
  340. 8060  GOSUB 7000
  341. 8070  GOSUB 15000
  342. 8080  '
  343. 8090  LINE (63,175)-(63,175)
  344. 8100  SCALEFACTOR = (MAXVAL-MINVAL)/160
  345. 8110  OLDX = 67 : OLDY = 175
  346. 8120  '
  347. 8130  LABELDISTANCE = LABELLENGTH + 1
  348. 8140  PLOTDISTANCE = LABELDISTANCE * 8
  349. 8150  IF DATAPOINTS > 35 THEN PLOTDISTANCE = 575 \ DATAPOINTS
  350. 8160  FOR PLOTPOINTS = 1 TO DATAPOINTS
  351. 8170  NEWX = OLDX + PLOTDISTANCE
  352. 8180  NEWY = 175 - (DATAVAL(PLOTPOINTS)-MINVAL)/SCALEFACTOR
  353. 8190  LINE (OLDX,OLDY)-(NEWX,NEWY)
  354. 8200  FOR Y = NEWY TO 175 STEP 3 : PSET (NEWX,Y) : NEXT Y
  355. 8210  OLDX = NEWX : OLDY = NEWY
  356. 8220  IF PRINTLABELS = 2 THEN 8260
  357. 8230  LABELPOSITION = 9+(LABELDISTANCE*PLOTPOINTS)-LEN(DATALABEL$(PLOTPOINTS))/2
  358. 8240  LOCATE 23,LABELPOSITION
  359. 8250  PRINT DATALABEL$(PLOTPOINTS);
  360. 8260  NEXT PLOTPOINTS
  361. 8270  LOCATE 25,1 : INPUT A$ : RETURN
  362. 9000  '
  363. 9010  '**********************************************************************
  364. 9020  '**  This Section Draws A Bar Graph                                  **
  365. 9030  '**********************************************************************
  366. 9040  '
  367. 9050  KEY OFF : SCREEN 2 : CLS : GRAPHTYPE = 2
  368. 9060  GOSUB 7000
  369. 9070  GOSUB 15000
  370. 9080  '
  371. 9090  SCALEFACTOR = (MAXVAL-MINVAL)/160
  372. 9100  OLDX = 67 : OLDY = 175
  373. 9110  '
  374. 9120  LABELDISTANCE = LABELLENGTH + 1
  375. 9130  PLOTDISTANCE = LABELDISTANCE * 8
  376. 9140  IF DATAPOINTS > 35 THEN PLOTDISTANCE = 575 \ DATAPOINTS
  377. 9150  FOR PLOTPOINTS = 1 TO DATAPOINTS
  378. 9160  NEWX = OLDX + PLOTDISTANCE
  379. 9170  NEWY = 175 - (DATAVAL(PLOTPOINTS)-MINVAL)/SCALEFACTOR
  380. 9180  FOR X = -(PLOTDISTANCE/4) TO (PLOTDISTANCE/4)
  381. 9190  LINE (NEWX-X,NEWY)-(NEWX-X,175)
  382. 9200  NEXT X
  383. 9210  OLDX = NEWX : OLDY = NEWY
  384. 9220  IF PRINTLABELS = 2 THEN 9260
  385. 9230  LABELPOSITION = 9+(LABELDISTANCE*PLOTPOINTS)-LEN(DATALABEL$(PLOTPOINTS))/2
  386. 9240  LOCATE 23,LABELPOSITION
  387. 9250  PRINT DATALABEL$(PLOTPOINTS);
  388. 9260  NEXT PLOTPOINTS
  389. 9270  LOCATE 25,1 : INPUT A$ : RETURN
  390. 10000  '
  391. 10010  '**********************************************************************
  392. 10020  '**  This Section Draws A Horizontal Bar Graph (20 Bars Maximun)     **
  393. 10030  '**********************************************************************
  394. 10040  '
  395. 10050  KEY OFF : SCREEN 2 : CLS : GRAPHTYPE = 3
  396. 10060  GOSUB 7000
  397. 10070  '
  398. 10080  '
  399. 10090  LINE (72,0)-(72,185) : LINE (48,175)-(636,175)
  400. 10100  LOCATE 1,25+(40-LEN(ATITLE1))/2 : PRINT ATITLE1;
  401. 10110  LOCATE 2,25+(40-LEN(ATITLE2))/2 : PRINT ATITLE2;
  402. 10120  LOCATE 25,25+(40-LEN(ATITLE4))/2 : PRINT ATITLE4;
  403. 10130  '
  404. 10140  '** FOR THE VERTICAL AXIS, CENTER THE LABEL WITHIN 18 CHAR OF BLANKS
  405. 10150  A$ = "" : L = LEN(ATITLE3) : L1 = (18-L)/2
  406. 10160  FOR X = 1 TO L1 : A$ = A$ + " " : NEXT X
  407. 10170  A$ = A$ + ATITLE3
  408. 10180  FOR X = LEN(A$) TO 18 : A$ = A$ + " " : NEXT X
  409. 10190  '
  410. 10200  '** NOW PRINT THE LABEL ON THE LEFT OF THE SCREEN
  411. 10210  FOR X = 3 TO 20
  412. 10220  LOCATE X,1 : PRINT MID$(A$,X-2,1);
  413. 10230  NEXT X
  414. 10240  '
  415. 10250  SCALEFACTOR = (MAXVAL - MINVAL) / 564
  416. 10260  '
  417. 10270  '**  DRAW OUT THE BARS (SPACED PROPERLY OF COURSE)
  418. 10280  GOSUB 10770
  419. 10290  '
  420. 10300  LINE (213,175)-(213,185) : LINE (354,175)-(354,185)
  421. 10310  LINE (495,175)-(495,185) : LINE (638,175)-(638,185)
  422. 10320  '
  423. 10330  '** CALCULATE OUT HOW TO PRINT THE VERTICAL SCALE AND PRINT IT
  424. 10340  '**
  425. 10350  '** IF MAXVAL >= 10000 THEN PRINT AS XXXXX
  426. 10360  '** IF 1000 >= MAXVAL > 10000 THEN PRINT AS XXXX
  427. 10370  '** IF  100 >= MAXVAL >  1000 THEN PRINT AS  XXX.X
  428. 10380  '** IF   10 >= MAXVAL >   100 THEN PRINT AS   XX.XX
  429. 10390  '** IF    1 >= MAXVAL >    10 THEN PRINT AS    X.XXX
  430. 10400  '** IF    0 >= MAXVAL >     1 THEN PRINT AS    0.XXX
  431. 10410  '**
  432. 10420  MAX = 2 + LOG(MAXVAL)/LOG(10) ' LOG BASE 10 = LN(X)/LN(10)
  433. 10430  IF MAX < 1 THEN MAX = 1
  434. 10440  IF MAX > 6 THEN MAX = 6
  435. 10450  ON MAX GOTO 10460,10460,10530,10600,10670,10670
  436. 10460  '
  437. 10470  '** VALUES FROM 0.001 TO 9.999
  438. 10480  LOCATE 23,74 : PRINT USING "#.###";MAXVAL;
  439. 10490  LOCATE 23,56 : PRINT USING "#.###";(MAXVAL - (MAXVAL - MINVAL) * 0.25);
  440. 10500  LOCATE 23,39 : PRINT USING "#.###";(MAXVAL - (MAXVAL - MINVAL) * 0.5);
  441. 10510  LOCATE 23,21 : PRINT USING "#.###";(MAXVAL - (MAXVAL - MINVAL) * 0.75);
  442. 10520  LOCATE 23,4  : PRINT USING "#.###";MINVAL; : GOTO 10740
  443. 10530  '
  444. 10540  '** VALUES FROM 10.00 TO 99.99
  445. 10550  LOCATE 23,74 : PRINT USING "##.##";MAXVAL;
  446. 10560  LOCATE 23,56 : PRINT USING "##.##";(MAXVAL - (MAXVAL - MINVAL) * 0.25);
  447. 10570  LOCATE 23,39 : PRINT USING "##.##";(MAXVAL - (MAXVAL - MINVAL) * 0.5);
  448. 10580  LOCATE 23,21 : PRINT USING "##.##";(MAXVAL - (MAXVAL - MINVAL) * 0.75);
  449. 10590  LOCATE 23,4  : PRINT USING "##.##";MINVAL; : GOTO 10740
  450. 10600  '
  451. 10610  '** VALUES FROM 100.0 TO 999.9
  452. 10620  LOCATE 23,74 : PRINT USING "###.#";MAXVAL;
  453. 10630  LOCATE 23,56 : PRINT USING "###.#";(MAXVAL - (MAXVAL - MINVAL) * 0.25);
  454. 10640  LOCATE 23,39 : PRINT USING "###.#";(MAXVAL - (MAXVAL - MINVAL) * 0.5);
  455. 10650  LOCATE 23,21 : PRINT USING "###.#";(MAXVAL - (MAXVAL - MINVAL) * 0.75);
  456. 10660  LOCATE 23,4  : PRINT USING "###.#";MINVAL; : GOTO 10740
  457. 10670  '
  458. 10680  '** VALUES FROM 1000 TO 99999
  459. 10690  LOCATE 23,74 : PRINT USING "#####";MAXVAL;
  460. 10700  LOCATE 23,56 : PRINT USING "#####";(MAXVAL - (MAXVAL - MINVAL) * 0.25);
  461. 10710  LOCATE 23,39 : PRINT USING "#####";(MAXVAL - (MAXVAL - MINVAL) * 0.5);
  462. 10720  LOCATE 23,21 : PRINT USING "#####";(MAXVAL - (MAXVAL - MINVAL) * 0.75);
  463. 10730  LOCATE 23,4  : PRINT USING "#####";MINVAL; : GOTO 10740
  464. 10740  '
  465. 10750  LOCATE 25,1 : INPUT A$ : RETURN
  466. 10760  '
  467. 10770  '** DRAW THE HORIZONTAL BARS
  468. 10780  '
  469. 10790  BAR = DATAPOINTS
  470. 10800  IF BAR > 20 THEN BAR = 20
  471. 10810  ON BAR GOTO 10840,10840,10840,10970,11110,11240,11240,11370,11370,11370
  472. 10820  '** IF HERE THEN 11 > BAR > 21
  473. 10830  GOTO 11500
  474. 10840  '
  475. 10850  '**  DRAWS BARS FOR 1 TO 3 ELEMENTS
  476. 10860  '
  477. 10870  SCALEFACTOR = (MAXVAL - MINVAL) / 564
  478. 10880  FOR X = 1 TO BAR
  479. 10890  LOCATE 2+X*6,3 : PRINT USING "\     \";DATALABEL$(X);
  480. 10900  BAR = (DATAVAL(X)-MINVAL)/SCALEFACTOR
  481. 10910  IF BAR < 0 THEN BAR = 0
  482. 10920  FOR Y = (8 + X*48) TO (14 + X*48)
  483. 10930  LINE (72,Y)-(72+BAR,Y)
  484. 10940  NEXT Y
  485. 10950  NEXT X
  486. 10960  RETURN
  487. 10970  '
  488. 10980  '**  DRAWS BARS FOR 4 ELEMENTS
  489. 10990  '
  490. 11000  SCALEFACTOR = (MAXVAL - MINVAL) / 564
  491. 11010  FOR X = 1 TO BAR
  492. 11020  LOCATE 1+X*5,3 : PRINT USING "\     \";DATALABEL$(X);
  493. 11030  BAR = (DATAVAL(X)-MINVAL)/SCALEFACTOR
  494. 11040  IF BAR < 0 THEN BAR = 0
  495. 11050  FOR Y = (X*40) TO (6 + X*40)
  496. 11060  LINE (72,Y)-(72+BAR,Y)
  497. 11070  BAR = (DATAVAL(X)-MINVAL)/SCALEFACTOR
  498. 11080  NEXT Y
  499. 11090  NEXT X
  500. 11100  RETURN
  501. 11110  '
  502. 11120  '**  DRAWS BARS FOR 5 ELEMENTS
  503. 11130  '
  504. 11140  SCALEFACTOR = (MAXVAL - MINVAL) / 564
  505. 11150  FOR X = 1 TO BAR
  506. 11160  LOCATE 5+X*3,3 : PRINT USING "\     \";DATALABEL$(X);
  507. 11170  BAR = (DATAVAL(X)-MINVAL)/SCALEFACTOR
  508. 11180  IF BAR < 0 THEN BAR = 0
  509. 11190  FOR Y = (32 + X*24) TO (38 + X*24)
  510. 11200  LINE (72,Y)-(72+BAR,Y)
  511. 11210  NEXT Y
  512. 11220  NEXT X
  513. 11230  RETURN
  514. 11240  '
  515. 11250  '**  DRAWS BARS FOR 6 THRU 7 ELEMENTS
  516. 11260  '
  517. 11270  SCALEFACTOR = (MAXVAL - MINVAL) / 564
  518. 11280  FOR X = 1 TO BAR
  519. 11290  LOCATE X*3,3 : PRINT USING "\     \";DATALABEL$(X);
  520. 11300  BAR = (DATAVAL(X)-MINVAL)/SCALEFACTOR
  521. 11310  IF BAR < 0 THEN BAR = 0
  522. 11320  FOR Y = (-8 + X*24) TO (-2 + X*24)
  523. 11330  LINE (72,Y)-(72+BAR,Y)
  524. 11340  NEXT Y
  525. 11350  NEXT X
  526. 11360  RETURN
  527. 11370  '
  528. 11380  '**  DRAWS BARS FOR 8 THRU 10 ELEMENTS
  529. 11390  '
  530. 11400  SCALEFACTOR = (MAXVAL - MINVAL) / 564
  531. 11410  FOR X = 1 TO BAR
  532. 11420  LOCATE 2+X*2,3 : PRINT USING "\     \";DATALABEL$(X);
  533. 11430  BAR = (DATAVAL(X)-MINVAL)/SCALEFACTOR
  534. 11440  IF BAR < 0 THEN BAR = 0
  535. 11450  FOR Y = (8 + X*16) TO (14 + X*16)
  536. 11460  LINE (72,Y)-(72+BAR,Y)
  537. 11470  NEXT Y
  538. 11480  NEXT X
  539. 11490  RETURN
  540. 11500  '
  541. 11510  '**  DRAWS BARS FOR 11 THRU 20 ELEMENTS
  542. 11520  '
  543. 11530  SCALEFACTOR = (MAXVAL - MINVAL) / 564
  544. 11540  FOR X = 1 TO BAR : W = 20 - DATAPOINTS
  545. 11550  LOCATE 2+X+W,3 : PRINT USING "\     \";DATALABEL$(X);
  546. 11560  BAR = (DATAVAL(X)-MINVAL)/SCALEFACTOR
  547. 11570  IF BAR < 0 THEN BAR = 0
  548. 11580  FOR Y = (8 + X*8 + W*8) TO (14 + X*8 + W*8)
  549. 11590  LINE (72,Y)-(72+BAR,Y)
  550. 11600  NEXT Y
  551. 11610  NEXT X
  552. 11620  RETURN
  553. 12000  '
  554. 12010  '**********************************************************************
  555. 12020  '**  This Section Draws A Circle Graph                               **
  556. 12030  '**********************************************************************
  557. 12040  '
  558. 12050  KEY OFF : SCREEN 2 : CLS : GRAPHTYPE = 4
  559. 12060  '
  560. 12070  '** Draw A Circle
  561. 12080  FOR X = -100 TO 100
  562. 12090  Y = (10000 - X*X)^0.5 * 0.5
  563. 12100  PSET (319+X,100+Y)
  564. 12110  PSET (319+X,100-Y)
  565. 12120  NEXT X
  566. 12130  FOR Y = -37 TO 37
  567. 12140  X = (2500 - Y*Y)^0.5 * 2
  568. 12150  PSET (319+X,100+Y)
  569. 12160  PSET (319-X,100+Y)
  570. 12170  NEXT
  571. 12180  '
  572. 12190  '** Find The Sum Of The Input Datapoints
  573. 12200  SUM = 0
  574. 12210  LASTPOINT = DATAPOINTS : IF LASTPOINT > 20 THEN LASTPOINT = 20
  575. 12220  FOR X = 1 TO LASTPOINT
  576. 12230  SUM = SUM + DATAVAL(X)
  577. 12240  NEXT X
  578. 12250  '
  579. 12260  '** Define A Couple Of Values
  580. 12270  PERCENT = 3.14159 * 2
  581. 12280  SCALEVALUE = PERCENT/SUM
  582. 12290  '
  583. 12300  '
  584. 12310  '** Draw The Pie Lines
  585. 12320  LINEVALUE = 0 : LINE (319,100)-(419,100)
  586. 12330  FOR Z = 1 TO DATAPOINTS
  587. 12340  LINEVALUE = LINEVALUE + DATAVAL(Z)
  588. 12350  X = COS (LINEVALUE * SCALEVALUE) * 100
  589. 12360  Y = SIN (LINEVALUE * SCALEVALUE) * 50
  590. 12370  LINE (319,100)-(319+X,100-Y)
  591. 12380  NEXT Z
  592. 12390  '
  593. 12400  '** Draw The Marker Lines And Labels
  594. 12410  LINEVALUE = 0
  595. 12420  FOR Z = 1 TO DATAPOINTS
  596. 12430  LINEVALUE = LINEVALUE + DATAVAL(Z)/2
  597. 12440  X = COS (LINEVALUE * SCALEVALUE) * 100
  598. 12450  Y = SIN (LINEVALUE * SCALEVALUE) * 50
  599. 12460  X2 = COS (LINEVALUE * SCALEVALUE) * 110
  600. 12470  Y2 = SIN (LINEVALUE * SCALEVALUE) * 55
  601. 12480  X1 = COS (LINEVALUE * SCALEVALUE) * 160
  602. 12490  Y1 = SIN (LINEVALUE * SCALEVALUE) * 80
  603. 12500  LINE (319+X2,100-Y2)-(319+X1,100-Y1)
  604. 12510  IF X1 >= 0 THEN 12520 ELSE 12540
  605. 12520  LINE (319+X1,100-Y1)-(519,100-Y1)
  606. 12530  LOCATE (104-Y1)/8,68 : PRINT USING "\     \";DATALABEL$(Z);:PRINT USING         "###.#";DATAVAL(Z)/SUM*100;: PRINT "%"; : GOTO 12560
  607. 12540  LINE (319+X1,100-Y1)-(119,100-Y1)
  608. 12550  LOCATE (104-Y1)/8,2  : PRINT USING "\     \";DATALABEL$(Z);:PRINT USING         "###.#";DATAVAL(Z)/SUM*100;: PRINT "%"; : GOTO 12560
  609. 12560  '
  610. 12570  LINEVALUE = LINEVALUE + DATAVAL(Z)/2
  611. 12580  NEXT Z
  612. 12590  LOCATE 1,20+(40-LEN(ATITLE1))/2 : PRINT ATITLE1;
  613. 12600  LOCATE 2,20+(40-LEN(ATITLE2))/2 : PRINT ATITLE2;
  614. 12610  LOCATE 25,1 :INPUT A$
  615. 12620  RETURN
  616. 15000  '
  617. 15010  '**********************************************************************
  618. 15020  '**  This Section Has Common Parts For Different Graph Types         **
  619. 15030  '**********************************************************************
  620. 15040  '
  621. 15050  LINE (63,0)-(63,185) : LINE (48,175)-(639,175)
  622. 15060  LOCATE 1,25+(40-LEN(ATITLE1))/2 : PRINT ATITLE1;
  623. 15070  LOCATE 2,25+(40-LEN(ATITLE2))/2 : PRINT ATITLE2;
  624. 15080  LOCATE 25,25+(40-LEN(ATITLE3))/2 : PRINT ATITLE3;
  625. 15090  '
  626. 15100  '** FOR THE VERTICAL AXIS, CENTER THE LABEL WITHIN 18 CHAR OF BLANKS
  627. 15110  A$ = "" : L = LEN(ATITLE4) : L1 = (18-L)/2
  628. 15120  FOR X = 1 TO L1 : A$ = A$ + " " : NEXT X
  629. 15130  A$ = A$ + ATITLE4
  630. 15140  FOR X = LEN(A$) TO 18 : A$ = A$ + " " : NEXT X
  631. 15150  '
  632. 15160  '** NOW PRINT THE LABEL ON THE LEFT OF THE SCREEN
  633. 15170  FOR X = 3 TO 20
  634. 15180  LOCATE X,1 : PRINT MID$(A$,X-2,1);
  635. 15190  NEXT X
  636. 15200  '
  637. 15210  '** CALCULATE OUT HOW TO PRINT THE VERTICAL SCALE AND PRINT IT
  638. 15220  '**
  639. 15230  '** IF MAXVAL >= 10000 THEN PRINT AS XXXXX
  640. 15240  '** IF 1000 >= MAXVAL > 10000 THEN PRINT AS XXXX
  641. 15250  '** IF  100 >= MAXVAL >  1000 THEN PRINT AS  XXX.X
  642. 15260  '** IF   10 >= MAXVAL >   100 THEN PRINT AS   XX.XX
  643. 15270  '** IF    1 >= MAXVAL >    10 THEN PRINT AS    X.XXX
  644. 15280  '** IF    0 >= MAXVAL >     1 THEN PRINT AS    0.XXX
  645. 15290  '**
  646. 15300  MAX = 2 + LOG(MAXVAL)/LOG(10) ' LOG BASE 10 = LN(X)/LN(10)
  647. 15310  IF MAX < 1 THEN MAX = 1
  648. 15320  IF MAX > 6 THEN MAX = 6
  649. 15330  ON MAX GOTO 15340,15340,15410,15480,15550,15550
  650. 15340  '
  651. 15350  '** VALUES FROM 0.001 TO 9.999
  652. 15360  LOCATE  3,3 : PRINT USING "#.###";MAXVAL;
  653. 15370  LOCATE  8,3 : PRINT USING "#.###";(MAXVAL - (MAXVAL - MINVAL) * 0.25);
  654. 15380  LOCATE 13,3 : PRINT USING "#.###";(MAXVAL - (MAXVAL - MINVAL) * 0.5);
  655. 15390  LOCATE 18,3 : PRINT USING "#.###";(MAXVAL - (MAXVAL - MINVAL) * 0.75);
  656. 15400  LOCATE 23,3 : PRINT USING "#.###";MINVAL; : GOTO 15620
  657. 15410  '
  658. 15420  '** VALUES FROM 10.00 TO 99.99
  659. 15430  LOCATE  3,3 : PRINT USING "##.##";MAXVAL;
  660. 15440  LOCATE  8,3 : PRINT USING "##.##";(MAXVAL - (MAXVAL - MINVAL) * 0.25);
  661. 15450  LOCATE 13,3 : PRINT USING "##.##";(MAXVAL - (MAXVAL - MINVAL) * 0.5);
  662. 15460  LOCATE 18,3 : PRINT USING "##.##";(MAXVAL - (MAXVAL - MINVAL) * 0.75);
  663. 15470  LOCATE 23,3 : PRINT USING "##.##";MINVAL; : GOTO 15620
  664. 15480  '
  665. 15490  '** VALUES FROM 100.0 TO 999.9
  666. 15500  LOCATE  3,3 : PRINT USING "###.#";MAXVAL;
  667. 15510  LOCATE  8,3 : PRINT USING "###.#";(MAXVAL - (MAXVAL - MINVAL) * 0.25);
  668. 15520  LOCATE 13,3 : PRINT USING "###.#";(MAXVAL - (MAXVAL - MINVAL) * 0.5);
  669. 15530  LOCATE 18,3 : PRINT USING "###.#";(MAXVAL - (MAXVAL - MINVAL) * 0.75);
  670. 15540  LOCATE 23,3 : PRINT USING "###.#";MINVAL; : GOTO 15620
  671. 15550  '
  672. 15560  '** VALUES FROM 1000 TO 99999
  673. 15570  LOCATE  3,3 : PRINT USING "#####";MAXVAL;
  674. 15580  LOCATE  8,3 : PRINT USING "#####";(MAXVAL - (MAXVAL - MINVAL) * 0.25);
  675. 15590  LOCATE 13,3 : PRINT USING "#####";(MAXVAL - (MAXVAL - MINVAL) * 0.5);
  676. 15600  LOCATE 18,3 : PRINT USING "#####";(MAXVAL - (MAXVAL - MINVAL) * 0.75);
  677. 15610  LOCATE 23,3 : PRINT USING "#####";MINVAL; : GOTO 15620
  678. 15620  '
  679. 15630  '** PRINT DASHES ON VERTICAL AXIS
  680. 15640  '
  681. 15650  LINE (56,15)-(63,15)
  682. 15660  LINE (56,55)-(63,55)
  683. 15670  LINE (56,95)-(63,95)
  684. 15680  LINE (56,135)-(63,135)
  685. 15690  '
  686. 15700  RETURN
  687. 30000  '
  688. 30010  '********************************************************************
  689. 30020  '**  Data-In Subroutine                                            **
  690. 30030  '********************************************************************
  691. 30040  'ROW = 20 : COLUMN = 20 : LENGTH = 20  **  USE THIS AS AN EXAMPLE  **
  692. 30050  'GOSUB 30080                           **  ON HOW TO ACCESS THIS   **
  693. 30060  'PRINT B$                              **  SUBROUTINE              **
  694. 30070  '********************************************************************
  695. 30080  B$ = ""
  696. 30090  FOR X = 1 TO LENGTH
  697. 30100  B$ = B$ + "-"
  698. 30110  NEXT X
  699. 30120  LOCATE ROW,COLUMN
  700. 30130  PRINT B$;
  701. 30140  '
  702. 30150  POINTER = 1 : A$ = " "
  703. 30160  WHILE (ASC(A$) <> 13)
  704. 30170  A$ = INPUT$(1)
  705. 30180  IF (POINTER > LENGTH) AND (ASC(A$) = 13) THEN 30300
  706. 30190  IF (POINTER > LENGTH) AND (ASC(A$) = 8) THEN 30250
  707. 30200  IF (POINTER > LENGTH) THEN 30300
  708. 30210  IF (ASC(A$) >= 32) THEN MID$(B$,POINTER,1) = A$ : POINTER = POINTER + 1 :       GOTO 30280
  709. 30220  IF (POINTER = 1) AND (ASC(A$) = 8) GOTO 30280
  710. 30230  IF (ASC(A$) <> 8) THEN 30270
  711. 30240     MID$(B$,POINTER,1) = "-"
  712. 30250     MID$(B$,POINTER-1,1) = "-"
  713. 30260     POINTER = POINTER -1
  714. 30270  IF (ASC(A$) = 13) THEN B$ = MID$(B$,1,POINTER-1) : POINTER = LENGTH + 1
  715. 30280  LOCATE ROW,COLUMN
  716. 30290  PRINT B$;
  717. 30300  WEND
  718. 30310  RETURN
  719.